package 尚硅谷.juc.test19;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class Test19 {

    /**
     * 通过银行办理业务的案例来模拟AQS如何进行线程的管理和通知唤醒机制
     * 3个线程模拟3个顾客
     */
    public static void main(String[] args) {
        ReentrantLock lock=new ReentrantLock();
        /**
         * A顾客是第一个顾客，此时手里窗口没有顾客，A就可以直接去办理
         * 但是A办理业务要20分钟
         */
        new Thread(()->{
            lock.lock();
            try {
                System.out.println("线程【A】执行业务..........");
                TimeUnit.MINUTES.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        },"A").start();
        /**
         * 线程B是第二个顾客，由于办理业务的窗口只有一个(也就是仅能一个线程持有锁)，
         * 此时B只能进入候客区等待
         *
         */
        new Thread(()->{
            lock.lock();
            try {
                System.out.println("线程【B】执行业务..........");
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        },"B").start();
        /**
         * 线程C是第三个顾客，由于办理业务的窗口只有一个(也就是仅能一个线程持有锁)，
         * 此时C只能进入候客区等待
         */
        new Thread(()->{
            lock.lock();
            try {
                System.out.println("线程【C】执行业务..........");
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        },"C").start();
    }
}
